import moment from "moment"
import { Config, Version } from '../components/index.js'

// cd需要的变量
let currentTime
let lastTime
let seconds
// 使用一个对象来存储每个用户决斗的次数
let counts = {}
// 决斗次数
let count

// 根据不同的功能返回不同的提示信息和cd时间
let msg
let cd

// cd键值
let name

if (Version.isMiao) {
    name = 'Mz'
} else {
    name = 'Yz'
}

// 导出一个函数，接收e作为参数，返回一个布尔值表示是否触发了cd
export async function checkCD(e) {
    // 根据e的msg判断是哪种功能,更新过期时间
    let fun
    if (e.msg.match(/^#?开导|打胶$/)) {
        fun = "ziwei"
        cd = Config.ypcd
    } else if (e.msg.match(/^#?嗦牛牛$/)) {
        fun = "suo"
        cd = Config.suonncd
    } else if (e.msg.match(/^#?决斗$/)) {
        fun = "playerpk"
        cd = Config.jjcd
    } else {
        return false // 不是这三种功能，直接返回false
    }

    // 获取当前时间和上次执行时间
    currentTime = moment(new Date()).format("YYYY-MM-DD HH:mm:ss")
    lastTime = await redis.get(`${name}:impart:${e.group_id}:${e.user_id}:${fun}`)
    // 获取当前用户的次数，如果没有就默认为0
    count = counts[`${e.user_id}-${e.group_id}`] || 0
    // 判断是否触发了cd
    if (
        (fun == "playerpk" && count >= 2 && lastTime) ||
        (fun != "playerpk" && lastTime)
    ) {
        seconds = moment(currentTime).diff(moment(lastTime), "seconds")
        switch (fun) {
            case "ziwei":
                msg = `导不动了，请等待${cd - seconds}秒后再去开导`
                break
            case "suo":
                msg = `嗦不动了，请等待${cd - seconds}秒后再嗦`
                break
            case "playerpk":
                msg = `战斗两次了太累了，请等待${cd - seconds}秒后再去🤺`
                break
        }
        let cdTIme = await redis.ttl(`${name}:impart:${e.group_id}:${e.user_id}:${fun}`)
        // 如果${ cd - seconds }秒小于cdTIme，就清除cd，并返回提示信息
        if (cd - seconds < cdTIme) {
            await cancelCD(e, 'clean cd')
            return `CD发生变化，请再试一次看看吧`
        }
        // 返回提示信息
        return msg
    } else {
        // 没有触发cd，更新执行时间并返回false
        await redis.set(`${name}:impart:${e.group_id}:${e.user_id}:${fun}`, currentTime, {
            EX: cd,
        })
        // 如果是决斗功能，更新用户的次数
        if (fun == "playerpk") {
            count++
            counts[`${e.user_id}-${e.group_id}`] = count
        }
        return false
    }
}

// 导出一个函数，接收e和str作为参数，根据不同的情况取消cd
export async function cancelCD(e, str) {
    // 根据e的msg判断是哪种功能
    let fun
    if (e.msg.match(/^#?开导|打胶$/)) {
        fun = "ziwei"
    } else if (e.msg.match(/^#?嗦牛牛$/)) {
        fun = "suo"
    } else if (e.msg.match(/^#?决斗$/)) {
        fun = "playerpk"
    } else {
        return false // 不是这三种功能，直接返回
    }

    // 根据不同的功能和str判断是否需要取消cd
    let needCancel = false
    switch (fun) {
        case "ziwei":
            if (
                str == `你还没有牛牛捏，赶快生成牛牛` ||
                str == `你还没有牛牛捏，快去生成牛牛叭。`
            ) {
                needCancel = true
            }
            break
        case "suo":
            if (
                str == `你还没有牛牛捏` ||
                str == `对方还没有牛牛捏` ||
                str == `对方还没有牛牛捏，你就不要强人所难咯。` ||
                str == `自己还没有牛牛捏，你就不要强人所难咯。`
            ) {
                needCancel = true
            }
            break
        case "playerpk":
            if (
                str == `你还没有牛牛捏` ||
                str == `对方还没有牛牛捏` ||
                str == `对方还没有牛牛捏，你就不要强人所难咯。`
            ) {
                needCancel = true
            }
            break
    }
    if(str == 'clean cd') needCancel = true
    // 如果需要取消cd，删除redis里对应的键值，并重置用户的次数
    if (needCancel === true) {
        await redis.del(`${name}:impart:${e.group_id}:${e.user_id}:${fun}`)
        if (fun == "playerpk") {
            count = 0
            counts[`${e.user_id}-${e.group_id}`] = count
        }
    }
}